/*
 * @Description:
 * @Author: jun.wu
 * @Date: 2022-09-21 14:17:01
 * @LastEditors: jun.wu
 * @LastEditTime: 2022-11-17 10:55:56
 */

//权限拦截在路由跳转
import router from "@/router";
import store from "@/store"; //引入store实例  和this.$store是一样的
import nprogress from "nprogress"; //引入进度条
import "nprogress/nprogress.css";

// 定义白名单
const whiteList = ["/login", "/404"];
//前置守卫
//next是必须执行的钩子 next必须执行，不然页面就死了
// next() 放过
// next(false)跳转终止
// next(地址)跳转到某个地址
router.beforeEach(async (to, from, next) => {
  nprogress.start(); //开启进度条
  if (store.getters.token) {
    //如果有token
    if (to.path === "/login") {
      //如果要访问的是登录页
      next("/"); //跳到主页
    } else {
      // 只有放行的时候才获取用户信息
      // 如果当前的vuex中有用户的id，表示已经有用户的资料了，不需要再次获取
      if (!store.getters.userId) {
        // async函数return的内容，用await就可以接受到
        const { roles } = await store.dispatch("user/getUserInfo");
        // 筛选用户的可用动态路由
        const routes = await store.dispatch(
          "permission/filterRoutes",
          roles.menus
        );
        // routes是筛选得到的动态路由
        // { path: "*", redirect: "/404", hidden: true },
        router.addRoutes([
          ...routes,
          {
            path: "*",
            redirect: "/404",
            hidden: true,
          },
        ]); //添加动态路由到路由表
        // 添加完动态路由之后
        // addRoutes  必须 用 next(地址) 不能用next()
        next(to.path); //相当于跳到对应的地址 相当于多做一次跳转
      } else {
        next();
      }
    }
  } else {
    // 在没有token的情况下
    if (whiteList.indexOf(to.path) > -1) {
      //表示要去的地址在白名单
      next();
    } else {
      next("/login");
    }
  }
  nprogress.done(); //强制关闭进度条
});

// 后置守卫
router.afterEach(() => {
  nprogress.done(); //关闭进度条
});
